{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "73bd968b-d970-4a05-94ef-4e7abf990827",
   "metadata": {},
   "source": [
    "Chapter 18\n",
    "\n",
    "# 定积分\n",
    "Book_3《数学要素》 | 鸢尾花书：从加减乘除到机器学习 (第二版)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e5aa62cf-8003-4ed9-bd20-64c9d27005d5",
   "metadata": {},
   "source": [
    "这段代码计算并可视化了函数\n",
    "\n",
    "$$\n",
    "f(x) = x^2 + \\frac{1}{2}\n",
    "$$\n",
    "\n",
    "在区间 $[a, b]$ 上的定积分。定积分可以理解为该函数在区间 $[a, b]$ 上方与 $x$ 轴之间的面积。具体来说，代码首先通过计算不定积分 $\\int f(x) \\, dx$ 得到函数的原函数，并在上下限 $a = 0$ 和 $b = 1$ 处代入计算：\n",
    "\n",
    "$$\n",
    "\\int_a^b f(x) \\, dx = F(b) - F(a)\n",
    "$$\n",
    "\n",
    "其中 $F(x)$ 是 $f(x)$ 的原函数。在计算出定积分值后，代码在图形上绘制出函数曲线，标记积分上下限 $a$ 和 $b$，并在区间 $[a, b]$ 内填充颜色来直观展示积分区域的面积。图形标题中显示的数值即为该积分区域的面积。通过这种方式，代码展示了定积分的几何意义，即在特定区间内，函数与 $x$ 轴之间的区域面积。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0c0179ea-8825-4c64-8f89-3bcd98709e8b",
   "metadata": {},
   "source": [
    "## 导入包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "849b5c40-4f59-45a7-8d6c-50db3ce2bb30",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sympy import *  # 导入符号计算库\n",
    "from matplotlib import pyplot as plt  # 导入绘图库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "e2de027a-1cfe-492d-a232-5583c946147e",
   "metadata": {},
   "outputs": [],
   "source": [
    "x = Symbol('x')  # 定义符号变量 x"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f43e42fc-84e1-4284-9ea8-f804d2a77beb",
   "metadata": {},
   "source": [
    "## 定义函数和积分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "f70f6f98-430c-4d3b-8797-ef62bd6f4a02",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle x^{2} + 0.5$"
      ],
      "text/plain": [
       "x**2 + 0.5"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f_x = x**2 + 1/2  # 定义函数 f(x) = x^2 + 1/2\n",
    "# f_x = x**2 - 1/2  # 可选函数 f(x) = x^2 - 1/2\n",
    "f_x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "de3dcad5-1a38-4bee-9b4d-2357661aee09",
   "metadata": {},
   "outputs": [],
   "source": [
    "f_x_fcn = lambdify([x], f_x)  # 将符号函数 f(x) 转换为可数值计算的函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "4d8f8543-fa57-4914-a340-af5757a2e2af",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 0.333333333333333 x^{3} + 0.5 x$"
      ],
      "text/plain": [
       "0.333333333333333*x**3 + 0.5*x"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "integral_f_x = integrate(f_x, x)  # 计算 f(x) 的不定积分\n",
    "integral_f_x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "170cf0ad-b8be-44ba-a29d-3ad6a5cfc004",
   "metadata": {},
   "outputs": [],
   "source": [
    "integral_f_x_fcn = lambdify([x], integral_f_x)  # 将不定积分转换为数值函数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "28c727d8-0bda-4441-82f1-ef6ed91a70c9",
   "metadata": {},
   "source": [
    "## 参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "985942ce-9129-40fd-88e2-e1169eee2156",
   "metadata": {},
   "outputs": [],
   "source": [
    "a = 0  # 积分下限\n",
    "b = 1  # 积分上限\n",
    "\n",
    "num = 201  # 网格数量\n",
    "x_array = np.linspace(-0.2, 1.2, num)  # x 的取值范围\n",
    "x_a_b_array = np.linspace(a, b, num)  # 积分区间内的 x 取值范围"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "398670b2-9779-4d96-bb01-2c408b1a6848",
   "metadata": {},
   "outputs": [],
   "source": [
    "y_array = f_x_fcn(x_array)  # 计算函数在 x_array 上的值\n",
    "y_a_b_array = f_x_fcn(x_a_b_array)  # 计算函数在积分区间 [a, b] 内的值"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ace0a6d7-af1e-4e18-8000-a42bd15d1430",
   "metadata": {},
   "source": [
    "## 计算定积分值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "4f33fe54-9ba1-4642-8ab3-86c32e1c2ab6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.833333333333333"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "integral_a_b = integral_f_x_fcn(b) - integral_f_x_fcn(a)  # 使用不定积分计算积分值\n",
    "integral_a_b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "a6e016ea-7f40-49e0-860c-889c25726c17",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle 0.833333333333333$"
      ],
      "text/plain": [
       "0.833333333333333"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "integral_a_b_v2 = integrate(f_x, (x, a, b))  # 使用定积分公式计算积分值\n",
    "integral_a_b_v2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "fa3759c8-d0f0-4add-92c6-55f95e482906",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8333333333333333"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "integral_a_b_v2 = float(integral_a_b_v2)  # 将结果转换为浮点数\n",
    "integral_a_b_v2"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0e497fac-0a84-4df0-9fed-998cd65a3f46",
   "metadata": {},
   "source": [
    "## 绘制函数和积分区间"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "eb1ff971-2bc8-43a2-9183-92a2c11b5441",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, '$\\\\int_a^b  f(x) = 0.8333$')"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk4AAAHVCAYAAAAHEHToAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABFW0lEQVR4nO3deVxVdf7H8fdVFhUBR0EWxa1yXxMXLCszMS3L8leajlpTFpmpmaVmU9o00T5OU7aYZuPS2KQ2Vmba4lLiOtCm2eKekjsIInDv/f7+OAOKgB0Q7uXC6/l4nAecw/fc+7knOr75nu/5HocxxggAAAC/q5q3CwAAAPAVBCcAAACbCE4AAAA2EZwAAABsIjgBAADYRHACAACwieAEAABgE8EJAADAJoITAACATQQnAAAAmwhOAAAANhGcAJSaMUYhISE6fPiwt0sBAI8gOAEotZ9//ln16tVTeHi4t0sBAI8gOAEoteTkZHXo0EF/+tOfFBISoq5du2rXrl3eLgsAyg3BCUCpJScnKykpScOHD9eRI0fUvHlz/fnPf/Z2WQBQbghOAEotOTlZjzzyiHr16qWAgACNGDFC33//vbfLAoByQ3ACUKQjR45o9OjR6t69u1588cUi2yQnJ+umm27KXz98+LDq1avnqRIBwOP8vF0AgIrH5XKpV69e+u677yRJGzduVFhYmEaMGJHf5sCBAzp06FCBgeHvv/+++vXr5/F6AcBT6HECUMhXX32l7777Th06dNDu3bsVFBSkWbNmFWiTnJwsPz8/vfvuu3I6nZozZ46Sk5N19913e6lqACh/9DgBKOTHH3+UJPXu3VuNGzfWG2+8IT+/gqeLvJC0aNEijRs3Tp07d9bKlSsVHBzsjZIBwCMITgAKOXHihCQpLCxMkjR06NBCbR599FFPlgQAFQKX6gAUkpGRIUmqXbu2lysBgIqF4ASgkLIMThkZGRo1apQaNGggPz8/NWvWTJL0xBNPqHXr1nK73SV+zdmzZ6tBgwbKzMy84PrsyMjI0Pjx4xUdHa0aNWqoY8eO+te//mVr3+TkZA0cOFDR0dGqVauWWrZsqSeeeEKnTp0q0C4lJUXXXXedGjVqpJo1a6pu3bqKi4vT/PnzS9WupG0B2MOlOgCFnDx5UpLKZLzShAkTtHjxYs2cOVONGzdWaGioDhw4oGeffVZz585VtWol//tt5MiReuaZZ/Tss89q+vTpF1zj77n55pu1efNmPf3002revLkWLlyo2267TW63u8jLmHm2bdumHj16qEWLFpoxY4bCwsK0du1aPfHEE9q6dav+85//5Lc9ceKEYmJidNttt+WHwgULFmj48OHavXt3/qVRu+1K2haATQYAzjF06FAjyXz88ccX9DrZ2dmmdu3a5qGHHiqw/eGHHzYNGjQwLper1K/9/PPPm9DQUJOZmXlBNf6ejz76yEgyCxcuLLC9T58+Jjo62jidzmL3nTp1qpFkfv755wLb7777biPJHDt27Hffv1u3biYmJqbM2pW0LYCCuFQHoJCyuFR3xx13KDAwUBkZGXruuefkcDjUvXt35eTkaPbs2Ro6dGih3qaDBw+qdu3aGjJkSIHtH374ofz9/TV16tT8bcOGDVN6errtS2altXTpUtWuXVu33HJLge133HGHDhw4oI0bNxa7r7+/vyQpNDS0wPY6deqoWrVqCggI+N33DwsLK3RH44W0K2lbAAURnAAUUhaX6iZNmqQpU6ZIkpYtW6akpCTNmzdPGzdu1NGjR9WrV69C+0RFRenhhx/Wu+++q61bt0qSVq9erVtuuUX33nuv/vrXv+a3jYyMVMuWLfXRRx8V+f7GGDmdTlvL+Xz33Xdq1apVoaDRvn37/J8XZ+TIkapTp47uvfde7dy5UydPntSHH36o119/Xffdd5+CgoIK7eN2u+V0OnX48GHNnDlTn3zyiSZNmlTqdiVtC+B3eLvLC0DF06VLlyIvMZXU/fffb/7whz8U2PbMM88YSSY1NbXIfTIzM010dLTp3bu32bRpkwkODjZ33HGHcbvdhdoOGzbMREREFPk6X3zxhZFka9m1a1exn+GSSy4xffv2LbT9wIEDRpJ56qmnznMEjNm+fbtp2bJlgfcbO3ZskZ/HGGPuueee/HYBAQFm5syZF9SupG0BnB99tQAKKau76rZu3arOnTsX2HbgwAE5HI78OaLOVatWLT355JP605/+pF69eum6667TrFmz5HA4CrWtX7++Dh06JKfTWahHqHPnztq8ebOtOqOjo8/786Le287Pdu/erQEDBigiIkLvvfeewsPDtXHjRj355JPKyMjQ7NmzC+3zyCOP6K677tKhQ4f0wQcfaMyYMcrMzNTEiRNL1a6kbQGcH8EJQCFlcanO5XIpJSVF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AJsITgAAADYRnAAAAGwiOBXh+PHjGj58uEJDQxUaGqrhw4frxIkTxbbPzc3VpEmT1K5dOwUFBSk6OlojRozQgQMHPFd0OZk5c6aaNm2qGjVqqHPnzlq3bt15269Zs0adO3dWjRo11KxZM7322mseqtTzSnJslixZoj59+ig8PFwhISGKi4vTJ5984sFqPaekvzN5vvrqK/n5+aljx47lW6AXlfTYZGdna+rUqWrcuLECAwN10UUXac6cOR6q1rNKemwWLFigDh06qFatWoqKitIdd9yho0ePeqhaz1m7dq0GDBig6OhoORwOvf/++7+7T1U5D5f02JTZedigkGuvvda0bdvWrF+/3qxfv960bdvWXH/99cW2P3HihLnmmmvMokWLzA8//GCSkpJMt27dTOfOnT1Yddn717/+Zfz9/c2sWbPMtm3bzLhx40xQUJDZs2dPke137txpatWqZcaNG2e2bdtmZs2aZfz9/c17773n4crLX0mPzbhx48wzzzxjNm3aZH788UczZcoU4+/vb/773/96uPLyVdLjkufEiROmWbNmJj4+3nTo0MEzxXpYaY7NDTfcYLp162ZWrVpldu3aZTZu3Gi++uorD1btGSU9NuvWrTPVqlUzf//7383OnTvNunXrTJs2bczAgQM9XHn5W758uZk6dapZvHixkWSWLl163vZV6Txc0mNTVudhgtM5tm3bZiSZDRs25G9LSkoykswPP/xg+3U2bdpkJP3uPxgVWdeuXU1CQkKBbS1btjSTJ08usv3DDz9sWrZsWWDbPffcY7p3715uNXpLSY9NUVq3bm2mT59e1qV5VWmPy+DBg82jjz5qHn/88UobnEp6bD7++GMTGhpqjh496onyvKqkx+a5554zzZo1K7DtpZdeMg0bNiy3GisCO+GgKp2Hz2bn2BSlNOdhLtWdIykpSaGhoerWrVv+tu7duys0NFTr16+3/TppaWlyOByqU6dOOVRZ/nJycrR161bFx8cX2B4fH1/scUhKSirUvm/fvtqyZYtyc3PLrVZPK82xOZfb7dbJkydVt27d8ijRK0p7XN566y398ssvevzxx8u7RK8pzbFZtmyZYmNj9eyzz6pBgwZq3ry5Jk6cqKysLE+U7DGlOTY9evTQ/v37tXz5chlj9Ntvv+m9997Tdddd54mSK7Sqch4uC6U9D/vMzOGekpqaqvr16xfaXr9+faWmptp6jdOnT2vy5MkaOnSozz508ciRI3K5XIUeiBwREVHscUhNTS2yvdPp1JEjRwo8bNmXlebYnOuFF15QZmambr311vIo0StKc1x++uknTZ48WevWrZOfX+U9HZXm2OzcuVNffvmlatSooaVLl+rIkSMaPXq0jh07VqnGOZXm2PTo0UMLFizQ4MGDdfr0aTmdTt1www36xz/+4YmSK7Sqch4uC6U9D1eZHqdp06bJ4XCcd9myZYukop+kbIyx9YTl3NxcDRkyRG63WzNnzizzz+Fp537m3zsORbUvantlUNJjk+edd97RtGnTtGjRoiJDuq+ze1xcLpeGDh2q6dOnq3nz5p4qz6tK8jvjdrvlcDi0YMECde3aVf3799eLL76ouXPnVrpeJ6lkx2bbtm0aO3asHnvsMW3dulUrVqzQrl27lJCQ4IlSK7yqdB4urQs5D1feP/HOMWbMGA0ZMuS8bZo0aaJvvvlGv/32W6GfHT58uFCKP1dubq5uvfVW7dq1S59//rnP9jZJUlhYmKpXr17oL75Dhw4VexwiIyOLbO/n56d69eqVW62eVppjk2fRokW688479e9//1vXXHNNeZbpcSU9LidPntSWLVuUnJysMWPGSLLCgjFGfn5+Wrlypa6++mqP1F7eSvM7ExUVpQYNGig0NDR/W6tWrWSM0f79+3XJJZeUa82eUppjk5iYqMsuu0wPPfSQJKl9+/YKCgpSz5499eSTT1bpXpWqch6+EBd6Hq4yPU5hYWFq2bLleZcaNWooLi5OaWlp2rRpU/6+GzduVFpamnr06FHs6+eFpp9++kmffvqpz/+CBgQEqHPnzlq1alWB7atWrSr2OMTFxRVqv3LlSsXGxsrf37/cavW00hwbyfoL5/bbb9fChQsr5ViMkh6XkJAQffvtt0pJSclfEhIS1KJFC6WkpBQYZ+jrSvM7c9lll+nAgQPKyMjI3/bjjz+qWrVqatiwYbnW60mlOTanTp1StWoF//mqXr26pDO9K1VVVTkPl1aZnIdLPAS9Crj22mtN+/btTVJSkklKSjLt2rUrNB1BixYtzJIlS4wxxuTm5pobbrjBNGzY0KSkpJiDBw/mL9nZ2d74CGUi7xbh2bNnm23btpnx48eboKAgs3v3bmOMMZMnTzbDhw/Pb593G+wDDzxgtm3bZmbPnl1pb4Mt6bFZuHCh8fPzM6+88kqB348TJ0546yOUi5Iel3NV5rvqSnpsTp48aRo2bGj+7//+z3z//fdmzZo15pJLLjF33XWXtz5CuSnpsXnrrbeMn5+fmTlzpvnll1/Ml19+aWJjY03Xrl299RHKzcmTJ01ycrJJTk42ksyLL75okpOT8+/Yrsrn4ZIem7I6DxOcinD06FEzbNgwExwcbIKDg82wYcPM8ePHC7SRZN566y1jjDG7du0ykopcvvjiC4/XX5ZeeeUV07hxYxMQEGAuvfRSs2bNmvyfjRw50lx55ZUF2q9evdp06tTJBAQEmCZNmphXX33VwxV7TkmOzZVXXlnk78fIkSM9X3g5K+nvzNkqc3AypuTHZvv27eaaa64xNWvWNA0bNjQTJkwwp06d8nDVnlHSY/PSSy+Z1q1bm5o1a5qoqCgzbNgws3//fg9XXf6++OKL8547qvJ5uKTHpqzOww5jqni/JgAAgE1VZowTAADAhSI4AQAA2ERwAgAAsIngBAAAYBPBCQAAwCaCEwAAgE0EJwAAAJsITgAAADYRnAAAAGwiOAEAANhEcAJQpRw+fFiRkZF66qmn8rdt3LhRAQEBWrlypRcrA+ALeFYdgCpn+fLlGjhwoNavX6+WLVuqU6dOuu666zRjxgxvlwaggiM4AaiS7rvvPn366afq0qWLvv76a23evFk1atTwdlkAKjiCE4AqKSsrS23bttW+ffu0ZcsWtW/f3tslAfABjHECUCXt3LlTBw4ckNvt1p49e7xdDgAfQY8TgConJydHXbt2VceOHdWyZUu9+OKL+vbbbxUREeHt0gBUcAQnAFXOQw89pPfee09ff/21ateurV69eik4OFgffviht0sDUMFxqQ5AlbJ69WrNmDFD8+bNU0hIiKpVq6Z58+bpyy+/1Kuvvurt8gBUcPQ4AQAA2ESPEwAAgE0EJwAAAJsITgAAADYRnAAAAGwiOAEAANhEcAIAALCJ4AQAAGATwQkAAMAmghMAAIBNBCcAAACbCE4AAAA2EZwAAABs+n8JdnCM8I1ttwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "ax.plot(x_array, y_array, 'b')  # 绘制函数曲线\n",
    "ax.axvline(x=a, color='r', linestyle='-')  # 绘制积分下限 a\n",
    "ax.axvline(x=b, color='r', linestyle='-')  # 绘制积分上限 b\n",
    "ax.axhline(y=0, color='k', linestyle='-')  # 添加 y=0 参考线\n",
    "\n",
    "ax.fill_between(x_a_b_array,\n",
    "                y_a_b_array, \n",
    "                edgecolor='none', \n",
    "                facecolor='#DBEEF3')  # 在积分区间 [a, b] 内填充颜色\n",
    "\n",
    "ax.set_xlim(-0.2, 1.2)  # 设置 x 轴范围\n",
    "ax.set_ylim(-1, 2)  # 设置 y 轴范围\n",
    "plt.gca().spines['right'].set_visible(False)  # 隐藏右边框\n",
    "plt.gca().spines['top'].set_visible(False)  # 隐藏上边框\n",
    "ax.set_xlabel('x')  # 设置 x 轴标签\n",
    "ax.set_ylabel('f(x)')  # 设置 y 轴标签\n",
    "ax.set_title(r'$\\int_a^b  f(x) = %0.4f$' % integral_a_b)  # 在标题中显示积分结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d0f945df-c99d-4963-a0e2-5c66a2bf315b",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "85a80909-2aac-49ed-bb7a-f8cc6b80ee7d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ecd322f4-f919-4be2-adc3-69d28ef25e69",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
